package main

import "fmt"

// VendingMachine 自动售货机
type VendingMachine struct {
	// 定义状态
	hasItem       State // 有商品状态
	itemRequested State // 请求商品状态
	hasMoney      State // 插入钱状态
	noItem        State // 无商品状态

	// 当前状态
	currentState State // 当前状态

	// 商品数量
	itemCount int // 当前的商品数量
	// 商品价格
	itemPrice int // 商品的价格
}

func newVendingMachine(itemCount, itemPrice int) *VendingMachine {
	v := &VendingMachine{
		itemCount: itemCount,
		itemPrice: itemPrice,
	}

	hasItemState := &HasItemState{
		vendingMachine: v,
	}

	itemRequestedState := &ItemRequestedState{
		vendingMachine: v,
	}

	hasMoneyState := &HasMoneyState{
		vendingMachine: v,
	}

	noItemState := &NoItemState{
		vendingMachine: v,
	}
	v.setState(hasItemState)
	// 注册状态
	v.hasItem = hasItemState
	v.itemRequested = itemRequestedState
	v.hasMoney = hasMoneyState
	v.noItem = noItemState
	return v
}

// 请求商品
func (v *VendingMachine) requestItem() error {
	return v.currentState.requestItem()
}

// 添加商品
func (v *VendingMachine) addItem(count int) error {
	return v.currentState.addItem(count)
}

// 放入rmb
func (v *VendingMachine) insertMoney(money int) error {
	return v.currentState.insertMoney(money)
}

// 下发商品
func (v *VendingMachine) dispenseItem() error {
	return v.currentState.dispenseItem()
}

// 设置当前的状态
func (v *VendingMachine) setState(s State) {
	v.currentState = s
}

// 添加商品状态
func (v *VendingMachine) incrementItemCount(count int) {
	fmt.Printf("Adding %d items\n", count)
	v.itemCount = v.itemCount + count
}
